package org.szy.admin.service.impl;


import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.StrUtil;
import com.mybatisflex.core.query.QueryWrapper;
import org.noear.solon.annotation.Inject;
import org.noear.solon.annotation.ProxyComponent;
import org.szy.admin.pojo.LoginMenuPojo;
import org.szy.admin.pojo.LoginMenuTreeNode;
import org.szy.admin.service.UserService;
import org.szy.core.auth.util.SaLoginUtil;
import org.szy.core.auth.util.SaUtil;
import org.szy.core.auth.util.SaUtil;
import org.szy.core.common.enums.CommonStatusEnum;
import org.szy.plugin.sys.entity.SysApp;
import org.szy.plugin.sys.entity.SysMenu;
import org.szy.plugin.sys.entity.SysUser;
import org.szy.plugin.sys.service.*;

import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

import static org.szy.plugin.sys.entity.table.SysAppTableDef.SYS_APP;

/**
 * 登录用户接口实现类
 *
 * @author 孙志阳
 * @date 2023-02-16
 * @since 1.0.0
 **/
@ProxyComponent
public class UserServiceImpl implements UserService {

    @Inject
    private SysUserRoleService sysUserRoleService;
    @Inject
    private SysAppService sysAppService;
    @Inject
    private SysMenuService sysMenuService;
    @Inject
    private SysUserService sysUserService;
    @Inject
    private SysRoleMenuService sysRoleMenuService;

    @Override
    public LoginMenuPojo menu() {
        LoginMenuPojo pojo = new LoginMenuPojo();
        String roles = SaLoginUtil.getRolesAsStr();
        // 根据用户角色获取用户菜单列表
        List<SysMenu> list = sysRoleMenuService.listMenuByRoleCode(roles);
        if (list.size() == 0) return pojo;

        // 获取系统应用列表 (最上面菜单)
        Set<String> appCodes = list.stream().map(SysMenu::getApplication).collect(Collectors.toSet());
        // 根据应用编码查询应用信息
        QueryWrapper qw = new QueryWrapper();
        qw.select(SYS_APP.CODE, SYS_APP.NAME, SYS_APP.ACTIVE)
                .and(SYS_APP.CODE.in(StrUtil.join(",", appCodes)))
                .and(SYS_APP.STATUS.eq(CommonStatusEnum.ENABLE.getKey())).orderBy(SYS_APP.ACTIVE.desc());
        ;
        // 查询应用信息
        List<SysApp> apps = sysAppService.list(qw);
        // 设置应用信息
        pojo.setApps(apps);

        // 获取菜单
        // 先排序，把默认启用的放到最前面
        CollectionUtil.sort(apps, (o1, o2) -> o2.getActive() - o1.getActive());
        // 创建一个空的Dict列表
        List<Dict> menus = CollectionUtil.newArrayList();
        // 遍历apps列表，获取每个应用的菜单列表
        apps.forEach(app -> {
            // 获取当前应用的菜单列表
            List<SysMenu> tempList = list.stream().filter(item -> item.getApplication().equals(app.getCode())).collect(Collectors.toList());
            // 将菜单列表转换为LoginMenuTreeNode树节点
            List<LoginMenuTreeNode> treeNode = LoginMenuTreeNode.buildLoginTreeNode(tempList);
            // 创建一个Dict对象
            Dict tempDict = Dict.create();
            // 将应用编码和树节点转换为Dict对象
            tempDict.put("code", app.getCode());
            tempDict.put("value", treeNode);
            // 将Dict对象添加到menus列表中
            menus.add(tempDict);
        });
        // 将menus列表转换为pojo对象
        pojo.setMenus(menus);

        return pojo;
    }

    @Override
    public boolean verifyPwd(String password) {
        SysUser user = sysUserService.getById(StpUtil.getLoginIdAsString(), "account", "password");
        if (user == null) return false;
        return SaUtil.verifyPwd(password, user.getPassword());
    }
}
